home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Programming / MiniGL / src / fog.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-04-11  |  3.7 KB  |  142 lines

  1. /*
  2.  * $Id: fog.c,v 1.1.1.1 2000/04/07 19:44:51 hfrieden Exp $
  3.  *
  4.  * $Date: 2000/04/07 19:44:51 $
  5.  * $Revision: 1.1.1.1 $
  6.  *
  7.  * (C) 1999 by Hyperion
  8.  * All rights reserved
  9.  *
  10.  * This file is part of the MiniGL library project
  11.  * See the file Licence.txt for more details
  12.  *
  13.  */
  14.  
  15. #include "sysinc.h"
  16.  
  17. static char rcsid[] = "$Id: fog.c,v 1.1.1.1 2000/04/07 19:44:51 hfrieden Exp $";
  18.  
  19. void GLFogf(GLcontext context, GLenum pname, GLfloat param)
  20. {
  21.     context->FogDirty = GL_TRUE;
  22.  
  23.     switch(pname)
  24.     {
  25.         case GL_FOG_MODE:
  26.             switch((GLint)param)
  27.             {
  28.                 case GL_LINEAR:
  29.                     context->w3dFogMode = W3D_FOG_LINEAR;
  30.                     break;
  31.                 case GL_EXP:
  32.                     context->w3dFogMode = W3D_FOG_EXP;
  33.                     break;
  34.                 case GL_EXP2:
  35.                     context->w3dFogMode = W3D_FOG_EXP_2;
  36.                     break;
  37.                 default:
  38.                     GLFlagError(context, 1, GL_INVALID_ENUM);
  39.             }
  40.             break;
  41.  
  42.         case GL_FOG_DENSITY:
  43.             GLFlagError(context, param<0, GL_INVALID_VALUE);
  44.             context->w3dFog.fog_density = (W3D_Float)param;
  45.             break;
  46.  
  47.         case GL_FOG_START:
  48.             context->FogStart = param;
  49.             break;
  50.  
  51.         case GL_FOG_END:
  52.             context->FogEnd   = param;
  53.             break;
  54.  
  55.         case GL_FOG_INDEX:
  56.             GLFlagError(context, 1, GL_INVALID_ENUM);
  57.             break;
  58.  
  59.         default:
  60.             GLFlagError(context, 1, GL_INVALID_ENUM);
  61.             break;
  62.     }
  63. }
  64.  
  65.  
  66.  
  67. void GLFogfv(GLcontext context, GLenum pname, GLfloat *param)
  68. {
  69.     context->FogDirty = GL_TRUE;
  70.  
  71.     switch(pname)
  72.     {
  73.         case GL_FOG_MODE:
  74.             switch((GLint)*param)
  75.             {
  76.                 case GL_LINEAR:
  77.                     context->w3dFogMode = W3D_FOG_LINEAR;
  78.                     break;
  79.                 case GL_EXP:
  80.                     context->w3dFogMode = W3D_FOG_EXP;
  81.                     break;
  82.                 case GL_EXP2:
  83.                     context->w3dFogMode = W3D_FOG_EXP_2;
  84.                     break;
  85.                 default:
  86.                     GLFlagError(context, 1, GL_INVALID_ENUM);
  87.             }
  88.             break;
  89.  
  90.         case GL_FOG_DENSITY:
  91.             GLFlagError(context, *param<0, GL_INVALID_VALUE);
  92.             context->w3dFog.fog_density = (W3D_Float)(*param);
  93.             break;
  94.         case GL_FOG_START:
  95.             context->FogStart = *param;
  96.             break;
  97.         case GL_FOG_END:
  98.             context->FogEnd   = *param;
  99.             break;
  100.         case GL_FOG_INDEX:
  101.             GLFlagError(context, 1, GL_INVALID_ENUM);
  102.             break;
  103.         case GL_FOG_COLOR:
  104.             context->w3dFog.fog_color.r = (W3D_Float)*param;
  105.             context->w3dFog.fog_color.g = (W3D_Float)*(param+1);
  106.             context->w3dFog.fog_color.b = (W3D_Float)*(param+2);
  107.             break;
  108.         default:
  109.             GLFlagError(context, 1, GL_INVALID_ENUM);
  110.             break;
  111.     }
  112. }
  113.  
  114. static float fog_Clamp(float f)
  115. {
  116.     if (f > 1.0)
  117.         f = 1.0;
  118.  
  119.     if (f < 0.0)
  120.         f = 0.0;
  121.  
  122.     return f;
  123. }
  124.  
  125. void fog_Set(GLcontext context)
  126. {
  127.     ULONG error;
  128.  
  129.     context->w3dFog.fog_start = fog_Clamp(-1.0 / ((context->FogStart) * (CurrentP->v[OF_43]) + (CurrentP->v[OF_44])));
  130.     context->w3dFog.fog_end   = fog_Clamp(-1.0 / ((context->FogEnd)   * (CurrentP->v[OF_43]) + (CurrentP->v[OF_44])));
  131.  
  132.     error = W3D_SetFogParams(context->w3dContext, &(context->w3dFog), context->w3dFogMode);
  133.     if (error == W3D_UNSUPPORTEDFOG)
  134.     {
  135.         context->w3dFogMode = W3D_FOG_INTERPOLATED;
  136.         error = W3D_SetFogParams(context->w3dContext, &(context->w3dFog), context->w3dFogMode);
  137.     }
  138.  
  139.     if (error != W3D_SUCCESS) mykprintf("Fog error %d\n", error);
  140. }
  141.  
  142.